package case13

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
	"log"
	"os"
	"time"
)

func Test() {
	fmt.Println("🎯示例十三：Gorm自动多对多")

	db, err := mysqlConnect()
	if err != nil {
		fmt.Println(err)
		return
	}

	if err := db.AutoMigrate(&UserCase13{}, &RoleCase13{}); err != nil {
		fmt.Println("自动创建结构失败：", err)
		return
	}

	//// 1. 创建角色
	//roles := []RoleCase13{
	//	{Name: "管理员"},
	//	{Name: "编辑"},
	//	{Name: "游客"},
	//}
	//db.Create(&roles)
	//
	//// 2. 创建用户并关联角色
	//user1 := UserCase13{
	//	Name: "张三",
	//	Roles: []RoleCase13{
	//		roles[0], // 管理员
	//		roles[1], // 编辑
	//	},
	//}
	//db.Create(&user1)
	//fmt.Println("创建成功...")

	// 预处理查询，根据用户id查询拥有的角色信息
	//var user1 UserCase13
	//db.Preload("Roles").Find(&user1, 1)
	//fmt.Println(user1)

	// 使用 GORM 的 Association 方法来操作多对多关系

	//查询用户
	var user1 UserCase13
	db.First(&user1, "name = ?", "张三")

	var r1 RoleCase13
	db.First(&r1, "id = ?", 3)
	fmt.Println(r1)

	var rArr2 []RoleCase13
	db.Find(&rArr2)
	// 添加关联
	//db.Model(&user1).Association("Roles").Append(&r1)
	// 删除关联
	//db.Model(&user1).Association("Roles").Delete(&r1)
	// 清空关联
	//db.Model(&user1).Association("Roles").Clear()
	// 替换关联
	//db.Model(&user1).Association("Roles").Replace(&rArr2)

	// 计数
	count := db.Model(&user1).Association("Roles").Count()
	fmt.Println(count)

	//根据用户id查询角色
	var rArr1 []RoleCase13
	db.Model(&user1).Association("Roles").Find(&rArr1)
	fmt.Println(rArr1)
	fmt.Println(user1)

}

// 初始化连接
func mysqlConnect() (*gorm.DB, error) {
	url := "root:123456@tcp(127.0.0.1:3306)/case1?charset=utf8mb4&parseTime=True&loc=Local"

	// 配置自定义 Logger 打印sql日志
	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
		logger.Config{
			SlowThreshold:             time.Second, // 慢 SQL 阈值
			LogLevel:                  logger.Info, // 可以设置为不同级别 Silent-不打印任何日志 Error-只打印错误日志 Warn-打印慢查询和错误 Info-打印慢查询和错误
			IgnoreRecordNotFoundError: true,        // 忽略ErrRecordNotFound（记录未找到）错误
			Colorful:                  true,        // 彩色打印
		},
	)

	db, err := gorm.Open(mysql.Open(url), &gorm.Config{
		Logger: newLogger, // 设置 Logger
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true, // 关闭默认，使用表名
		},
	})
	if err != nil {
		return nil, fmt.Errorf("mysql connect err: %v", err)
	}

	return db, nil
}

// 用户结构体
type UserCase13 struct {
	ID    int          `gorm:"primarykey;autoIncrement"`
	Name  string       `gorm:"type:varchar(20);unique"`
	Roles []RoleCase13 `gorm:"many2many:user_role_case13;"` // 使用 many2many 标签
}

// 角色结构体
type RoleCase13 struct {
	ID    int          `gorm:"primarykey;autoIncrement"`
	Name  string       `gorm:"type:varchar(20);unique"`
	Users []UserCase13 `gorm:"many2many:user_role_case13;"` // 双向关联
}
